package com.heima.test6;

import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.ObjectOutputStream;
import java.lang.reflect.Constructor;
import java.util.*;
import java.util.function.Function;
import java.util.stream.Collectors;

public class Demo1 {
    public static void main(String[] args) {
        try {
            // - 1  在包com.heima.test下定义学生类Student 有name 和 age 两个成员变量
            // - 2  加载文件内容,存放到Properties对象中,根据className的值获取类对象
            Properties p = new Properties();
            FileReader reader = new FileReader("stu.properties");
            // 加载文件
            p.load(reader);
            System.out.println(p);
            String className = p.getProperty("className");
            Class<?> aClass = Class.forName(className);
            p.remove("className");
            // - 3  获取Properties对象中所有学生的value值,存放到List集合中
            System.out.println(p);
            Set<String> set = p.stringPropertyNames();
            ArrayList<String> list = new ArrayList<>();
            for (String key : set) {
                String value = p.getProperty(key);
                list.add(value);
            }
            System.out.println(list);
            // - 4  使用stream流,把list集合中前3条数据,转为student对象(通过反射得到实例对象),最后收集到set集合中,
            Class<Student> clz = Student.class;
            Set<Student> collect = list.stream().limit(3).map(new Function<String, Student>() {
                @Override
                public Student apply(String s) {
                    try {
                        String[] ss = s.split(",");
                        Constructor<?> c = clz.getDeclaredConstructor(String.class, int.class);
                        Object o = c.newInstance(ss[0], Integer.parseInt(ss[1]));
                        return (Student) o;
                    } catch (Exception e) {
                        throw new RuntimeException(e);
                    }
                }
            }).collect(Collectors.toSet());


            // - 5  把集合中学生 按照年龄从大到小排序
            TreeSet<Student> ts = new TreeSet<>((o1, o2) -> o1.age > o2.age ? -1 : 1);
            ts.addAll(collect);
            // - 6  把集合中年龄最大的学生获取到, 序列化保存到stumax.txt文件中
            System.out.println(ts);

            Student stu = ts.first();// 获取第一个年龄最大的学生
            System.out.println(stu);
            ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("stumax.txt"));
            // oos.writeObject(stu);
            oos.writeObject(stu);
            oos.close();
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }
}
